/**
 * 媒体文件工具函数
 * 提供媒体文件管理相关的通用方法
 */

/**
 * 获取文件扩展名
 * @param {string} filename 文件名
 * @returns {string} 文件扩展名（小写）
 */
export function getFileExtension(filename) {
  return filename.split('.').pop()?.toLowerCase() || ''
}

/**
 * 获取文件类型的CSS类名
 * @param {Object} file 媒体文件对象
 * @returns {string} CSS类名
 */
export function getFileTypeClass(file) {
  const ext = getFileExtension(file.name).toLowerCase()
  
  // 文档类型
  if (['doc', 'docx', 'rtf', 'odt', 'pages'].includes(ext)) return 'file-type-doc'
  
  // PDF类型
  if (['pdf'].includes(ext)) return 'file-type-pdf'
  
  // JSON类型
  if (['json'].includes(ext)) return 'file-type-json'
  
  // 文本类型
  if (['txt', 'md', 'log', 'xml', 'html', 'css', 'js', 'ts'].includes(ext)) return 'file-type-txt'
  
  // Excel类型
  if (['xls', 'xlsx', 'csv', 'numbers', 'ods'].includes(ext)) return 'file-type-xls'
  
  // PowerPoint类型
  if (['ppt', 'pptx', 'key', 'odp'].includes(ext)) return 'file-type-ppt'
  
  // 压缩文件类型
  if (['zip', 'rar', '7z', 'tar', 'gz'].includes(ext)) return 'file-type-zip'
  
  // 音频类型
  if (['mp3', 'wav', 'ogg', 'flac', 'm4a', 'aac'].includes(ext)) return 'file-type-audio'
  
  // 视频类型
  if (['mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv', 'webm'].includes(ext)) return 'file-type-video'
  
  // 代码类型
  if (['java', 'py', 'cpp', 'c', 'cs', 'php', 'rb', 'go', 'swift'].includes(ext)) return 'file-type-code'
  
  // 设计文件类型
  if (['psd', 'ai', 'sketch', 'fig', 'xd'].includes(ext)) return 'file-type-design'
  
  // 根据文件类型返回通用CSS类
  if (file.type === 'document') return 'file-type-doc'
  if (file.type === 'image') return 'file-type-image'
  
  // 默认为其他类型
  return 'file-type-other'
}

/**
 * 格式化时间显示
 * @param {string} time 时间字符串
 * @returns {string} 格式化后的时间字符串
 */
export function formatTime(time) {
  const date = new Date(time)
  const now = new Date()
  const diff = now.getTime() - date.getTime()

  // 如果时间差为负数或非常小（处理时间同步问题），显示"刚刚"
  if (diff < 60 * 1000) {
    return '刚刚'
  }

  // 不超过24小时显示相对时间
  if (diff < 24 * 60 * 60 * 1000) {
    const hours = Math.floor(diff / (60 * 60 * 1000))
    if (hours < 1) {
      const minutes = Math.floor(diff / (60 * 1000))
      return `${minutes} 分钟前`
    }
    return `${hours} 小时前`
  }

  // 不超过7天显示周几
  if (diff < 7 * 24 * 60 * 60 * 1000) {
    const days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
    return days[date.getDay()]
  }

  // 其他情况显示年月日
  return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`
}

/**
 * 解析文件大小字符串为数字（用于排序）
 * @param {string} size 文件大小字符串（如：1.2MB）
 * @returns {number} 转换后的字节数
 */
export function parseFileSize(size) {
  const num = parseFloat(size)
  const unit = size.replace(/[\d.]/g, '').toLowerCase()
  const units = { kb: 1024, mb: 1024 ** 2, gb: 1024 ** 3 }
  return num * (units[unit] || 1)
}

/**
 * 对媒体列表进行排序
 * @param {Array} list 待排序的媒体列表
 * @param {string} sortType 排序类型
 * @returns {Array} 排序后的列表
 */
export function sortMediaList(list, sortType) {
  return [...list].sort((a, b) => {
    switch (sortType) {
      case 'name':
        return a.name.localeCompare(b.name)
      case 'time':
        return new Date(b.updateTime).getTime() - new Date(a.updateTime).getTime()
      case 'size':
        return parseFileSize(b.size) - parseFileSize(a.size)
      default:
        return 0
    }
  })
}

/**
 * 获取指定类型的文件数量
 * @param {Array} mediaList 媒体文件列表
 * @param {string} type 文件类型 ('all', '0', '1', '2')
 * @returns {number} 文件数量
 */
export function getTypeCount(mediaList, type) {
  if (type === 'all') return mediaList.length
  return mediaList.filter((item) => item.type === type || item.typeDisplay === type).length
}

/**
 * 获取指定分组的文件数量
 * @param {Array} mediaList 媒体文件列表
 * @param {number} groupId 分组ID
 * @returns {number} 文件数量
 */
export function getGroupCount(mediaList, groupId) {
  return mediaList.filter((item) => item.groupId === groupId).length
}

/**
 * 生成媒体文件的Markdown链接
 * @param {Object} file 媒体文件对象
 * @returns {string} Markdown格式的链接
 */
export function generateMarkdownLink(file) {
  return file.type === 'image' 
    ? `![${file.name}](${file.url})` 
    : `[${file.name}](${file.url})`
}

/**
 * 复制文本到剪贴板
 * @param {string} text 要复制的文本
 * @returns {Promise<boolean>} 是否复制成功
 */
export async function copyToClipboard(text) {
  try {
    await navigator.clipboard.writeText(text)
    return true
  } catch (error) {
    console.error('复制失败:', error)
    return false
  }
} 